package com.code.aicodemother.service;

import com.code.aicodemother.model.dto.AppAddRequest;
import com.code.aicodemother.model.dto.AppQueryRequest;
import com.code.aicodemother.model.entity.User;
import com.code.aicodemother.model.vo.AppVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.code.aicodemother.model.entity.App;
import jakarta.servlet.http.HttpServletRequest;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author ys
 */
public interface AppService extends IService<App> {

    /**
     * 校验应用
     *
     * @param app 应用
     * @param add 是否为创建校验
     */
    void validApp(App app, boolean add);

    /**
     * 获取脱敏的应用信息
     *
     * @param app 应用
     * @return 脱敏后的应用信息
     */
    AppVO getAppVO(App app);

    /**
     * 获取脱敏的应用信息列表
     *
     * @param appList 应用列表
     * @return 脱敏后的应用信息列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 获取查询条件
     *
     * @param appQueryRequest 应用查询请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 获取当前用户可以访问的应用查询条件
     *
     * @param appQueryRequest 应用查询请求
     * @param request HTTP请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest, HttpServletRequest request);

    /**
     * 聊天并生成代码
     *
     * @param appId  应用ID
     * @param message 聊天消息
     * @param LoginUser 登录用户
     * @return 代码生成结果流
     */
    Flux<String> chatToGenCode(Long appId, String message, User LoginUser);

    /**
     * 部署应用
     *
     * @param appId  应用ID
     * @param loginUser 登录用户
     * @return 应用访问URL
     */
    String deployApp(Long appId, User loginUser);

    /**
     * 异步生成应用截图并更新封面
     *
     * @param appId  应用ID
     * @param appUrl 应用访问URL
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 创建应用
     *
     * @param appAddRequest 应用添加请求
     * @param loginUser 登录用户
     * @return 应用ID
     */
    Long createApp(AppAddRequest appAddRequest, User loginUser);
}
